
/* Generated by Interface Builder */

#import "LPCView.h"
#import "LPCPlot.h"
#import <appkit/Window.h>
#import <appkit/Application.h>
#import <dpsclient/wraps.h>
#import <dpsclient/dpsclient.h>

/* 
 *  Shorthand for drawing a hairline cursor
 */
#define CURSORL(w) PScompositerect(cursorloc, 0, w, NX_HEIGHT(&frame), NX_HIGHLIGHT);

@implementation LPCView

+ newFrame:(const NXRect *)frameRect
{
	self = [super newFrame:frameRect];
	width = 0.0;
	cursorloc = 0.0;
	[self setCursor:NO];
	[self setCursorType:HAIRLINE];
	return self;
}

- drawSelf:(const NXRect *)rects :(int)rectCount
{	
	PSsetgray(NX_WHITE);
	[self lockFocus];
	[self unlockFocus];
	[self setCursor:NO];
	width = 0.0;
	if (parent)
		[parent drawData];
	[self drawCurs];
	return self;
}

#define DRAG_MASK (NX_MOUSEUPMASK|NX_MOUSEDRAGGEDMASK)

- mouseDown:(NXEvent *)event
{
	int	oldMask;
	NXPoint	p;
	
	[self lockFocus];
	
	oldMask = [[self window] addToEventMask:DRAG_MASK];
	
	if ([self cursorOn]) {
		CURSORL(width);	// off
	}
	cursorloc = -1.0;
	width = 1.0;
	[self setCursor:YES];
	p = event->location;
	[self convertPoint:&p fromView:nil];
	p.x = (p.x < 0.0) ? 0.0 : p.x;
	p.x = (p.x > NX_WIDTH(&bounds)) ? NX_WIDTH(&bounds) : p.x;
	cursorloc = p.x;
	CURSORL(width);		// on
	for (;;) {
		event = [NXApp getNextEvent:DRAG_MASK];
		switch (event->type) {
		   case NX_MOUSEDRAGGED :
			switch([self cursorType]) {
			   case SELECTION :
			   	p = event->location;
				[self convertPoint:&p fromView:nil];
				p.x = (p.x < 0.0) ? 0.0 : p.x;
				p.x = (p.x > NX_WIDTH(&bounds)) ? NX_WIDTH(&bounds) : p.x;
				CURSORL(width); // off
				width = (p.x - cursorloc);
				CURSORL(width); // on
				break;
			   case HAIRLINE :
			   	p = event->location;
				[self convertPoint:&p fromView:nil];
				p.x = (p.x < 0.0) ? 0.0 : p.x;
				p.x = (p.x > NX_WIDTH(&bounds)) ? NX_WIDTH(&bounds) : p.x;
				CURSORL(width);	// off
				
				width = 1.0;
				cursorloc = p.x;
				CURSORL(width);	// on
				break;
			}
			break;
		   case NX_MOUSEUP :
		   	goto done;
		   	break;
		}
		[parent updateCursor:self];
		[[self window] flushWindow];
		NXPing();  // use only if there is a speed problem
	}
done:	[[self window] setEventMask:oldMask];
	[self unlockFocus];
	[parent updateCursor:self];
	return self;
}

- drawCurs
{
	[self lockFocus];
	CURSORL(width);
	[[self window] flushWindow];
	[self unlockFocus];
	[self setCursor:YES];
	return self;
}

- changeCurs:(float)loc:(float)wid
{
	[self lockFocus];
	if ([self cursorOn]) {
		CURSORL(width);	// off
	}
	cursorloc = loc;
	width = wid;
	CURSORL(width);
	[[self window] flushWindow];
	NXPing();
	[self unlockFocus];
	return self;
}

- drawPlot:(float *)data :(char *)ops :(float *)bbox :(int) num :(float) scale
{
	if (!num) 
		return self;
	[self lockFocus];
	PSsetgray(scale);
	DPSDoUserPath((void *)data, num*4, dps_float, ops, num*2, (void *)bbox, dps_ustroke);
	[self unlockFocus];
	return self;
		
}
- setCursor:(BOOL)val
{
	displayCursor = val;
	return self;
}

- (BOOL) cursorOn
{
	return displayCursor;
}

- (BOOL) acceptsFirstResponder
{
	return YES;
}

- setDelegate:anObject
{
	delegate = anObject;
	return self;
}

- setParent:par
{
	parent = par;
	return self;
}
- (int) getcurPos
{
	return cursorloc;
}
- (int) getWidth
{
	return width;
}

- setCursorType:(int)type
{
	cursortype = type;
	return self;
}

- (int)cursorType
{
	return cursortype;
}

@end
